package com.itextpdf.text.pdf.table;
import com.itextpdf.testutils.CompareTool;
import com.itextpdf.testutils.TestResourceUtils;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class KeepRowsTogetherTest {
private String cmpFolder = "./src/test/resources/com/itextpdf/text/pdf/table/keeprowstogether/";;
private String outFolder = "./target/com/itextpdf/test/pdf/table/keeprowstogether/";
@Before
public void setUp() throws Exception {
new File(outFolder).mkdirs();
TestResourceUtils.purgeTempFiles();
}
/**
* Creates two tables and both should be on their own page.
*
* @throws DocumentException
* @throws IOException
* @throws InterruptedException
*/
@Test
public void testKeepRowsTogetherInCombinationWithHeaders() throws DocumentException, IOException, InterruptedException {
final String file = "withheaders.pdf";
createDocument(file, 0, 10, "Header for table 2", true, false);
compareDocuments(file);
}
/**
* Creates two tables and the second table should have one row on pae 1 and every other row on page 2.
*
* @throws DocumentException
* @throws IOException
* @throws InterruptedException
*/
@Test
public void testKeepRowsTogetherWithoutHeader() throws DocumentException, IOException, InterruptedException {
final String file = "withoutheader.pdf";
createDocument(file, 1, 10, "Header for table 2 (should be on page 1, not a header, just first row)", false, false);
compareDocuments(file);
}
/**
* Creates two tables. The second table has 1 header row and it should skip the first header. 1 line of table 2 should be on page 1, the rest on page 2.
*
* @throws FileNotFoundException
* @throws DocumentException
*/
@Test
public void testKeepRowsTogetherInCombinationWithSkipFirstHeader() throws FileNotFoundException, DocumentException {
final String file = "withskipfirstheader.pdf";
createDocument(file, 2, 10, "Header for Table 2", true, true);
}
/**
* Utility method
*
* @param file fileName
* @param start start index for the keepRowsTogether method
* @param end end index for the keepRowsTogether method
* @param header2Text text for the second table's header
* @throws FileNotFoundException
* @throws DocumentException
*/
private void createDocument(final String file, final int start, final int end, final String header2Text, final boolean headerRows, final boolean skipFirstHeader) throws FileNotFoundException, DocumentException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(outFolder + file));
document.open();
document.add(createTable("Header for table 1", true, 1, skipFirstHeader));
PdfPTable table = createTable(header2Text, headerRows, 2, skipFirstHeader);
table.keepRowsTogether(start, end);
document.add(table);
document.close();
}
/**
* Utility ethod that creates a table with 41 rows. One of which may or may not be a header.
*
* @param headerText text for the first cell
* @param headerRows is the first row a header
* @param tableNumber number of the table
* @return PdfPTable
*/
private PdfPTable createTable(final String headerText, final boolean headerRows, final int tableNumber, final boolean skipFirstHeader) {
PdfPTable table = new PdfPTable(1);
PdfPCell cell1 = new PdfPCell(new Paragraph(headerText));
table.addCell(cell1);
if ( headerRows ) {
table.setHeaderRows(1);
if ( skipFirstHeader ) {
table.setSkipFirstHeader(skipFirstHeader);
}
}
for (int i = 0; i < 40; i++) {
table.addCell("Tab " + tableNumber + ", line " + i);
}
return table;
}
/**
* Utility method that checks the created file against the cmp file
* @param file name of the output document
* @throws DocumentException
* @throws InterruptedException
* @throws IOException
*/
private void compareDocuments(final String file) throws DocumentException, InterruptedException, IOException {
// compare
CompareTool compareTool = new CompareTool();
String errorMessage = compareTool.compareByContent(outFolder + file, cmpFolder + file, outFolder, "diff");
if (errorMessage != null) {
Assert.fail(errorMessage);
}
}
}